/**
  @file     	DESIGNPATTERN_ComputerComponent.h 
  @brief    	1.When the algorithm to create complex object should be independent of the part of the object, 
                  as well as their assembly;
				2.When construction process must be allowed to construct the object is different;
  @author  	arvin
  @version 	1.0   2012/12/20
 */

#ifndef CXX_DESIGNPATTERN_COMPUTERCOMPONENT_H
#define CXX_DESIGNPATTERN_COMPUTERCOMPONENT_H

#include "ProductDef.h "

class ComputerComponent
{
public:

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	virtual ~ComputerComponent();

	/**
	* Operation
	*
	* @param VOID
	* @return
	*/
	virtual VOID Operation();

	/**
	* GetComputer
	*
	* @param VOID
	* @return COMPUTER_TYPE
	*/
	COMPUTER_TYPE GetComputer();
protected:
	/**
	* Construction
	*
	* @param COMPUTER_TYPE eComputer
	* @return
	*/
	ComputerComponent(COMPUTER_TYPE eComputer);

	/**
	* SetComputer
	*
	* @param COMPUTER_TYPE eComputer
	* @return
	*/
	VOID SetComputer(COMPUTER_TYPE eComputer);

private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	ComputerComponent();

	/**
	* Copy Construction
	*
	* @param const ComputerComponent& cComputerComponent
	* @return
	*/
	ComputerComponent(const ComputerComponent& cComputerComponent);

	/**
	* Assignment
	*
	* @param const ComputerComponent& cComputerComponent
	* @return ComputerComponent&
	*/
	ComputerComponent& operator=(const ComputerComponent& cComputerComponent);

public:
protected:
private:
	COMPUTER_TYPE m_eComputer;
};

class DesktopComponent : public ComputerComponent
{
public:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	DesktopComponent();

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	virtual ~DesktopComponent();

	/**
	* Operation
	*
	* @param VOID
	* @return
	*/
	virtual VOID Operation();
protected:
private:
	/**
	* Copy Construction
	*
	* @param const DesktopComponent& cDesktopComponent
	* @return
	*/
	DesktopComponent(const DesktopComponent& cDesktopComponent);

	/**
	* Assignment
	*
	* @param const DesktopComponent& cDesktopComponent
	* @return DesktopComponent&
	*/
	DesktopComponent& operator=(const DesktopComponent& cDesktopComponent);

public:
protected:
private:
};

class NotebookComponent : public ComputerComponent
{
public:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	NotebookComponent();

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	virtual ~NotebookComponent();

	/**
	* Operation
	*
	* @param VOID
	* @return
	*/
	virtual VOID Operation();
protected:
private:
	/**
	* Copy Construction
	*
	* @param const NotebookComponent& cNotebookComponent
	* @return
	*/
	NotebookComponent(const NotebookComponent& cNotebookComponent);

	/**
	* Assignment
	*
	* @param const NotebookComponent& cNotebookComponent
	* @return NotebookComponent&
	*/
	NotebookComponent& operator=(const NotebookComponent& cNotebookComponent);

public:
protected:
private:
};

class ServerComponent : public ComputerComponent
{
public:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	ServerComponent();

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	virtual ~ServerComponent();

	/**
	* Operation
	*
	* @param VOID
	* @return
	*/
	virtual VOID Operation();
protected:
private:
	/**
	* Copy Construction
	*
	* @param const ServerComponent& cServerComponent
	* @return
	*/
	ServerComponent(const ServerComponent& cServerComponent);

	/**
	* Assignment
	*
	* @param const ServerComponent& cServerComponent
	* @return ServerComponent&
	*/
	ServerComponent& operator=(const ServerComponent& cServerComponent);

public:
protected:
private:
};
#endif	/* >>CXX_DESIGNPATTERN_COMPUTERCOMPONENT_H<< */
/* EOF */